﻿<html>
<head>
	<meta http-equiv=Content-Type content="text/html;charset=utf-8"/>
	<title>hiwii语言</title>
</head>
<body>
<a href="index.jsp">hiwii系统和hiwii语言介绍</a>
<b>hiwii语言语法</b>
<a href="tut1.html">hiwii语言教程</a>
<a href="/hiwii/">hiwii语言会话</a>
<hr/>
<p>1	语法</p>
<p>语法由符号、表达式组成。</p>
<p>1.1	符号</p>
<p>所有可见字符和不可见字符构成了系统间共享的符号集。可见字符不仅包括键盘上的字符，也包括其它合法的编码字符，如汉字等。</p>
<p>符号分类如下：</p>
<p>1.1.1	英文字母</p>
<p>由[A-Za-z]组成，分大小写。</p>
<p>1.1.2	数字digit</p>
<p>由[0-9]组成。</p>
<p>1.1.3	特殊符号</p>
<p>由以下可见符号组成</p>
<p>`	~	!	@	#	$	%	^	&	*</p>
<p>(	)	_	-	+	=	{	}	[	]</p>
<p>|	\	:	;	"	'	<	>	,	.</p>
<p>?	/								</p>
<p>即标准键盘上的特殊符号。</p>
<p>1.1.4	不可见字符</p>
<p>不可见字符包括：\t,\n,\r,\f和空格。</p>
<p>1.1.5	其它字符</p>
<p>除以上字符外的其它unicode字符，比如汉字等。</p>
<p>1.2	表达式</p>
<p>符号的有序排列，并用于表示一个对象或认识，即表达式。</p>
<p>表达式有二种基本格式，标志表达式(Identifier)和函数表达式（Function）。标志表达式用来表示具体指代或引用，函数表达式以函数映射形式表示具体指代或引用。</p>
<p>id和function是最基础的表达式，所有其它表达式最终都可以理解为id或function形式的异化形式。比如：数字和字符也可以用id表示，然后以函数形式进行有序组合。</p>
<p>由标志表达式和函数表达式组成的表达式称作复合表达式。</p>
<p>系统提供的基础表达式包括：String、Number、Character。这些是系统已定义的表达式。</p>
<p>1.2.1	分隔符</p>
<p>包括：(){},[];?$#.组成。</p>
<p>()	必须成对出现，否则语法报错。</p>
<p>{}	必须成对出现，否则语法报错。</p>
<p>[]	必须成对出现，否则语法报错。</p>
<p>,	</p>
<p>;	语句分隔符</p>
<p>$  !	$表示肯定判断分隔符，!表示否定判断分隔符</p>
<p>#	动作分隔符</p>
<p>.	运算分隔符，比所有一元操作符优先级低，高于所有二元操作符</p>
<p>空格 \t \n \r \f	用于分割表达式</p>
<p>'"	''和""也必须成对出现，''一般用于表示一个字符，""用于表示字符串。</p>
<p>	</p>
<p>/ 	当左侧和右侧是整数时，作为分数线。否则作为操作符。</p>
<p>// 	单行注释</p>
<p>/** */	说明注释</p>
<p>/* */	多行注释</p>
<p>"/"在其它语言中，一般表示"除"运算符号，然而在数学中，分数是经常使用的表达式，如果hiwii语言不能简单的表示分数，我认为实在是一个遗憾。因此，hiwii语言当”/”的左右紧邻都是整数时， "/"优先表示分数线，其它情况，如一侧不为整数，或有空格时，"/"表示除号。</p>
<p>()、{}、[]必须成对出现，而且不能交叉，如：([.....)]是无效语法。</p>
<p>1.2.2	Identifier</p>
<p>Identifier、Function。是用户可以定义的表达式。</p>
<p>Identifier不能以数字开头，不能包含除”_”外的特殊符号。</p>
<p>特殊符号中，”_” 与字母的使用方式相同，可以出现在identifier开头、中间或结尾的任何位置，可以连续多次使用。</p>
<p>identifier用来表示确定的对象、认识、运算、action或判断。</p>
<p>比如：ab,n3,id_,_n</p>
<p>1.2.3	Function表达式</p>
<p>Function表达式格式：identifier(arg0,arg1……)</p>
<p>function的定义必须至少有一个参数。function调用不必提供所有参数。当function调用没有提供参数值，表示参数值为Null。</p>
<p>应用中没有参数的函数和identifier是不同的。比如函数f()表示调用f(x)定义，但提供的参数值是null。</p>
<p>函数表达式举例：</p>
<p>abs(3),f("abc"),someFunction("abc",3)。</p>
<p>函数表达式的参数可以是任意表达式，比如：</p>
<p>f(g(x),3)</p>
<p>1.2.4	操作符</p>
<p>操作符根据表达式不同，分为一元操作符和二元操作符。一元操作符位于二元操作符后面时，优先级高于二元操作符。一元操作符位于二元操作符前面时，优先级低于二元操作符。</p>
<p>例如：</p>
<p>4 + -3 //表示 4 + (- 3)</p>
<p>-3.mod(2)  //表示 –(3.mod(2)) ,如果要优先处理一元运算符，用()</p>
<p>(-3).mod(2)  //优先处理一元运算符</p>
<p>每个操作符都对应一个identifier。操作符结合操作数，与函数调用是一一对应的。如：2+3 等价于：plus(2,3)</p>
<p>系统操作符对应的identifier如下</p>
<p>^	power</p>
<p>*   	multiply</p>
<p>+	plus</p>
<p>-	minus</p>
<p>/	divide</p>
<p>%	percent</p>
<p>>	GT</p>
<p><	LT</p>
<p>>= 	GE</p>
<p><=	LE</p>
<p>=	EQ</p>
<p>!=	NE</p>
<p>==  	equal</p>
<p>&	and</p>
<p>|	or</p>
<p>@	AT</p>
<p>?	bang</p>
<p>:	colon</p>
<p>~	tilde</p>
<p>&&	SCand</p>
<p>||	SCor</p>
<p>>>	RSHIFT</p>
<p><<	LSHIFT</p>
<p>`	</p>
<p></p>
<p>所有操作符即可以作为一元操作符，也可以作为二元操作符。当操作符在表达式前面就是一元操作符，否则就是二元操作符。</p>
<p>只有二元操作符需要有优先级，以下是部分二元操作符，按照优先级从高到低排列如下</p>
<p>^	</p>
<p>*   /  %	</p>
<p>+  -	</p>
<p>>  <  >=  <=	</p>
<p>==  !=	</p>
<p>&	</p>
<p>|  	</p>
<p>=	</p>
<p>:	</p>
<p>	</p>
<p>&&	</p>
<p>||	</p>
<p>>>  <<	</p>
<p>	</p>
<p>?	</p>
<p>@ 	</p>
<p>` 	</p>
<p>~ 	</p>
<p>操作符根据功能分为两类，运算操作符和逻辑操作符。运算操作符分为三级，分别以幂、乘除、加减代表。逻辑操作符分为比较运算符、等价运算符、逻辑与运算符、逻辑或运算符，优先顺序如图。逻辑操作符优先级低于运算操作符。</p>
<p>一元操作符不分级，采用右结合方式依次运算。如：</p>
<p>---3 表示  -(-(-3))</p>
<p>"与"、"或"运算是程序编码时代的产物，针对的对象是二进制数，由于当时使用较多，因此用"&"、"|"表示。然而当前是应用开发的时代，对用户而言，二进制数的操作早已不是关注的重点，因此二进制运算符就取消了，如果用户愿意，可以通过操作符重载来重新恢复它的定义。操作符重载在后面章节介绍。</p>
<p>"="即等号，在大部分编程语言中表示赋值运算符，而用"=="表示等价比较，这对于人们的习惯是不符的。在hiwii语言中，"="的意思就是“是”， "=="表示逻辑相等。在数学中，"="就表示等价，在这点，hiwii语言也与大部分人的习惯相同。通过操作符重载，用户也可以用"="表示赋值，但只能用于指令语句中。</p>
<p>原有程序员习惯的操作符虽然没有完全保留它们在其它语言中的含义，但&&、||、>>、<<等符号仍作为操作符保留。</p>
<p>"-"即负号在hiwii语言中不仅可以作为一元运算操作符，也可以作为一元的逻辑操作符表示"非"。在大部分计算机语言中，逻辑非操作符是用"!"表示的，由于在hiwii语言中，明确划分了运算、判断、动作，因此同一操作符在运算、判断、动作中可以分别表示不同的意义。这样"!"也就不需要由系统定义，而由"-"代替。而"!"用来表示否定判断的主语和判断词分隔符。</p>
<p>在大部分语言中，还有一些别的复杂符号，那些只为了程序员少写几个字符的可代替的符号，比如>>>、+=、-=、*=、/=、>>>等符号在hiwii语言中不再支持。</p>
<p>对于在java，c语言中常见的++、- -运算符由于和连续的一元运算符有冲突，而且为了减少每行指令的字符数增加了语法难度，因此，hiwii语言中也不使用。</p>
<p>1.2.5	character</p>
<p>字符是构成表达式的基本元素，每个UNICODE字符也是字符。</p>
<p>如：'a','+','汉','字'等。</p>
<p>空格的表示方法：' '</p>
<p>不可见字符需要用一些特殊格式表示，即：'\t','\n','\r','\f'。</p>
<p>由于'\'用来做转义符表示不可见字符，因此'\'本身也成为特殊字符，用'\\'表示。</p>
<p>1.2.6	String</p>
<p>字符串是“”内包含有序符号列表，比如：</p>
<p>"abc"</p>
<p>"I am Tom"</p>
<p>"hiwii语言"</p>
<p>空字符串表示一个长度为0的字符串，表示方法""。就其本身而言，空字符串不是符号的有序排列。</p>
<p>1.2.7	Number</p>
<p>用来表示数字的表达式。Number表达式在hiwii系统中分为四类，分别是：整数表达式、浮点数表达式、分数表达式和科学计数表达式。</p>
<p>1.2.7.1	整型</p>
<p>全部由数字组成，比如：3，45，1234等</p>
<p>1.2.7.2	浮点数</p>
<p>就是表达式中间有小数点的数，比如：1.0，2.34等</p>
<p>1.2.7.3	分数</p>
<p>格式：int1/int2。分数的分子和分母必须都是整型数。</p>
<p>比如：3/4，4/5，7/4等。</p>
<p>分数只有真分数和假分数两种类型。</p>
<p>1.2.7.4	科学计数</p>
<p>科学计数由两个部分组成，实数部分和指数部分。科学计数形式严格按照数学要求，实数部分必须介于[1, 10]之间，即大于等于1，小于10。指数部分必须是整数。指数部分可以是一个负数。</p>
<p>格式：float/int[e/E][+|-]int</p>
<p>比如：3e2,</p>
<p>1.23e3</p>
<p>3.4e-3</p>
<p>科学计数法与前面三种计数法不同。整数、小数、分数的表示范围顺序扩大，所有的整数能够用小数表示，所有的小数能够用分数表示。但科学计数法的表示范围并不能覆盖分数的表示范围。它不能准确的表示所有分数，甚至不能表示0。科学计数法只是能够更好的表示一个很大的数。比如:1e80。如果用其它表示方法，这个简单的数需要写满几行。</p>
<p>1.2.8	二进制数</p>
<p>二进制数是计算机时代的标志，二进制数的处理是计算机的基本功能。二进制数有三种表示方法，即二进制表示、八进制表示和十六进制表示。Java和c中，二进制数是整数的一种表示方式，而hiwii语言把二进制数分离出来，进行不同的处理。</p>
<p>1.2.8.1	二进制</p>
<p>格式：0[b/B][01]+</p>
<p>即以0b或0B开始，后面跟至少一个0或1。</p>
<p>如：0b00001111</p>
<p>1.2.8.2	八进制</p>
<p>格式：0[o/O][0-7]+</p>
<p>即以0o或0O开始，后面跟至少一个0-7之间的数字。</p>
<p>如：0o1234567</p>
<p>在java和c中，八进制数以0开始表示。Hiwii语言中，表达式第二个字符位置必须是O(是字母O,而不是数字0)。</p>
<p>1.2.8.3	十六进制</p>
<p>格式：0[x/X][0-9a-fA-F]+</p>
<p>即以0x或0X开始，后面跟至少一个0-9或a-f之间的字母或数字。</p>
<p>如：0xe3</p>
<p></p>
<p>1.2.9	主语Action表达式</p>
<p>Object #id/function</p>
<p>表示使主语object执行id或function表示的动作。</p>
<p>如：左手#挥动</p>
<p>如果表达式接收方是一个人，上述表达式就是指示其做一个左手的挥动动作</p>
<p>1.2.10	主语Operation表达式</p>
<p>Object.id/function</p>
<p>表示获得主语object的目标对象或认识。</p>
<p>比如：“abc”.length</p>
<p>1.2.11	主语Judgment表达式</p>
<p>Object$id/function;//肯定判断</p>
<p>Object!id/function;//否定判断</p>
<p>表示判断主语object是否符合id或function表示的判断表达式。</p>
<p>比如：</p>
<p>1、这件衣服$蓝色</p>
<p>2、这件衣服!蓝色</p>
<p>上述两句分别表示两个判断，第一句表示"这件衣服是蓝色"，第二句表示"这件衣服不是蓝色"。</p>
<p>从例句可以看出，"$"符号表示"是"，而"!"符号表示"不是"</p>
<p>1.2.12	一元和二元运算表达式</p>
<p>一部分符号用来作为操作符使用，根据操作数的不同，分为一元运算表达式和二元运算表达式。</p>
<p>一元运算表达式：只有一个操作数的表达式称作一元运算表达式。</p>
<p>二元运算表达式：操作符在中间，左侧和右侧各有一个表达式的复合表达式称作二元运算表达式。</p>
<p>当二元表达式作为另一二元表达式的操作数时，按照操作符的优先级进行组合。</p>
<p>比如：</p>
<p>一元表达式：+2，-3</p>
<p>二元表达式：2+3,4*5,6%3</p>
<p>2+3*4;//表示2+(3*4)</p>
<p>所有的操作符都对应一个id，所有一元和二元运算表达式也都对应一个函数表达式，比如：</p>
<p>3+2 ===> plus(3, 2)</p>
<p>-3  ===> minus(3)</p>
<p>1.2.13	括号表达式</p>
<p>格式：(Expression)</p>
<p>如：(3+2),(a>3)等。括号的优先级最高，括号表达式一般用来优先进行运算或判断。当主语较长时，也可以用括号来表示较长的主语，如：</p>
<p>(2+3+4+5+6).compare(20)</p>
<p>括号表达式当跟在一个identifier表达式后面时，用于作为参数的容器，具体的意义由函数表达式进行描述。</p>
<p>1.2.14	中括号表达式</p>
<p>以[]包围，以","分隔的表达式集合。</p>
<p>()[]{}三种表达式分别表示不同的意义。()表达式表示一个具有最高优先级的表达式，{}表达式运用在程序执行中，表示进入了一个执行环境，环境内如果定义了参数，环境外是不能访问的。而中括号表达式只是多个表达式组合在一起的表示方式。从逻辑角度，[]内的元素和[]外的元素是处于相同等级的。如果不考虑执行环境，[]表达式和{}表达式在执行中意义是相同的。[]表达式也可以用在运算表达式中，表示有序集合。有序对(Ordered Pair)，支持有序对的基础运算，cons/car/cdr</p>
<p>1.2.15	模块Block</p>
<p>Block是以{}包围，以";"分隔的表达式集合。</p>
<p>模块格式：</p>
<pre>{
	expression1;
	expression2;
	…….
   expression n;
}</pre>
<p>Block本身也是一个表达式，因此Block可以嵌套，如：</p>
<pre>{
	expression1;
	expression2;
       {
		expression3;
	};
}</pre>
<p></p>
<p>block表达式来源于java和C/C++。但是java中，if语句/while语句等没有”;”，而hiwii要求所有语句末尾有”;”。与java不同的另外一个特点是，block中的最后一个表达式允许没有”;”。这个特点已被groovy、go等语言采用。这样定义更符合”;”作为分隔符的定义，正如”,”在函数参数列表中作为分隔符，最后一个参数不必有”,”一样。比如：{statement1;statement2;statement3}</p>
<p>与java类似，模块不只出现在分支、循环语句中，模块可以作为语句单独出现。比如：</p>
<pre>{
	expression1;
	{
		expression2;
	};
}</pre>
<p></p>
<p>1.2.16	注释</p>
<p>与java相同，有三种注释类型。注释提供了一种代码辅助阅读的格式。</p>
<p>1.2.16.1	行末注释：</p>
<p>//…..</p>
<p>1.2.16.2	正式注释：</p>
<p>/**</p>
<p>……</p>
<p>*/</p>
<p>1.2.16.3	多行注释</p>
<p>/*</p>
<p>……</p>
<p>*/</p>
<p>1.3</p>
<hr/>
<p>欢迎关注我的微博：hiwiinet。我的微信qq号：332700461。我的博客：hiwiinet.blog.163.com</p>

</body>